package com.javabasic.net.netty.client;

import org.jboss.netty.channel.*;

/**
 * @Author xiongmin
 * @Description //TODO
 * @Date 2019/12/12 22:08
 * @Version 1.0
 **/
public class HelloClientHandler extends SimpleChannelHandler {
    /**
     * 接收消息
     * @param ctx
     * @param e
     * @throws Exception
     */
    @Override
    public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception {
        super.messageReceived(ctx, e);

        // 没有使用StringDecoder,要用下面的方式才能打印出客户端发来的消息, 使用GBK编码不会出现中文乱码，使用UTF-8会中文乱码
//        ChannelBuffer message1 = (ChannelBuffer) e.getMessage();
//        String msg = new String(message1.array(),"GBK");
//        System.out.println(msg);

        // 现在会中文乱码
        String message = (String) e.getMessage();
        System.out.println("服务端回显数据：" + message);

        // 回写数据
//        ChannelBuffer channelBuffer = ChannelBuffers.copiedBuffer("niha".getBytes());
//        ctx.getChannel().write(channelBuffer);

        // 使用StringEncoder之后的回写数据方式
//        ctx.getChannel().write("nihao");
    }

    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, ExceptionEvent e) throws Exception {
        System.out.println("连接出现异常");
        super.exceptionCaught(ctx, e);
        ctx.getChannel().close();
    }

    /**
     * 新连接
     * @param ctx
     * @param e
     * @throws Exception
     */
    @Override
    public void channelConnected(ChannelHandlerContext ctx, ChannelStateEvent e) throws Exception {
        System.out.println("连接服务端成功");
        super.channelConnected(ctx, e);

    }

    /**
     * 连接关闭，建立连接成功，关闭通道以后才会执行
     * @param ctx
     * @param e
     * @throws Exception
     */
    @Override
    public void channelDisconnected(ChannelHandlerContext ctx, ChannelStateEvent e) throws Exception {
        System.out.println("退出服务端连接");
        super.channelDisconnected(ctx, e);
    }

    /**
     * 释放Channel资源关闭,就算没有建立连接成功也会执行
     * @param ctx
     * @param e
     * @throws Exception
     */
    @Override
    public void channelClosed(ChannelHandlerContext ctx, ChannelStateEvent e) throws Exception {
        System.out.println("Channel资源关闭");
        super.channelClosed(ctx, e);
    }
}
